package com.example.controller;

import com.alipay.api.AlipayApiException;
import com.alipay.api.internal.util.AlipaySignature;
import com.example.utils.AppUtils;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * @author 游家纨绔
 * @dateTime 2023-09-09 10:00
 * @apiNote TODO 支付宝同步返回页面的控制器
 */
@Controller
public class ReturnController {

	// 接受支付宝返回的同步通知信息（这里是用户输入支付密码、确认支付后，面向用户的回调接口）
	@RequestMapping("/getReturn")
	public void getReturn(HttpServletRequest request, HttpServletResponse response) throws AlipayApiException, IOException {
		// 获取支付宝返回的信息
		Map<String, String> params = new HashMap<>();
		Map<String, String[]> parameterMap = request.getParameterMap();
		for (String name : parameterMap.keySet()) {
			String[] value = parameterMap.get(name);
			String valueStr = "";
			for (int i = 0; i < value.length; i++) {
				valueStr = (i == value.length - 1) ? valueStr + value[i] : valueStr + value[i] + " ,";
			}
			params.put(name, valueStr);
		}

		// 调用支付宝的SDK验证签名
		// TODO rsaCheckV1()方法用于面对面支付、手机支付，网页支付、扫码支付等方式的验签；
		//      rsaCheckV2()方法用于生活缴费、手机充值等业务的验签。
		//      因此如果在这里我们的验签方式跟我们处理的业务不相匹配就会出现验签失败，无法返回相应的数据
		boolean signVerified = AlipaySignature.rsaCheckV1(params, AppUtils.alipay_public_key,
		                                                  AppUtils.charset, AppUtils.sign_type);

		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		// 验签成功
		if (signVerified) {
			// 获取商户订单号
			String outTradeNo = request.getParameter("out_trade_no");
			// 支付宝的交易号
			String tradeNo = request.getParameter("trade_no");
			// 付款金额
			String totalAmount = request.getParameter("total_amount");
			// 写入日志(这里的商户订单号我是按照时间生成的)
			AppUtils.logResult("在" + outTradeNo + "时间里，成功完成一起交易，且支付交易号为：" + tradeNo);
			// 打印请求
			out.println("支付宝交易号 trade_no = " + tradeNo + ", 商户订单号 out_trade_no = " + outTradeNo + ", 付款金额 total_amount = " + totalAmount);
		} else {
			out.println("验签失败");
		}
	}

}
